package cn.iocoder.yudao.module.product.spu.dal.dataobject;

import cn.iocoder.yudao.framework.business.basic.pojo.po.MerchantScopeEntity;
import cn.iocoder.yudao.framework.mybatis.core.type.IntegerListTypeHandler;
import cn.iocoder.yudao.framework.mybatis.core.type.StringListTypeHandler;
import cn.iocoder.yudao.module.api.dine.enums.DineAttributeEnum;
import cn.iocoder.yudao.module.api.product.spu.enums.ProductPriceModeEnum;
import cn.iocoder.yudao.module.api.product.spu.enums.ProductSpuRecommendEnum;
import cn.iocoder.yudao.module.api.product.spu.enums.ProductSpuStatusEnum;
import cn.iocoder.yudao.module.api.trade.delivery.enums.DeliveryTypeEnum;
import cn.iocoder.yudao.module.product.brand.dal.dataobject.ProductBrandDO;
import cn.iocoder.yudao.module.product.category.dal.dataobject.ProductCategoryDO;
import cn.iocoder.yudao.module.product.sku.dal.dataobject.ProductSkuDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 产品 SPU
 * TODO 后续重构，产品中心的产品表只存储通用的基础的数据，商城/餐饮/酒店/家政/景区等不同模块的产品扩展数据放在各自模块
 *
 * @author 芋道源码
 */
@TableName(value = "product_spu", autoResultMap = true)
@KeySequence("product_spu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductSpuDO extends MerchantScopeEntity {

    /**
     * 产品类型，可根据主营类目转换得来，如：mall、food、hotel
     *
     * @see cn.iocoder.yudao.module.api.shop.category.eums.ShopCategoryCodeEnum
     */
    private String type;

    /**
     * 产品名称
     */
    private String name;
    /**
     * 关键字
     */
    private String keyword;
    /**
     * 产品简介
     */
    private String introduction;
    /**
     * 产品详情
     */
    private String description;
    /**
     * 条形码
     */
    private String barCode;
    /**
     * 行业类目编号
     */
    private Long platformCategoryId;
    /**
     * 产品分类编号
     * <p>
     * 关联 {@link ProductCategoryDO#getId()}
     */
    private Long categoryId;
    /**
     * 产品品牌编号
     * <p>
     * 关联 {@link ProductBrandDO#getId()}
     */
    private Long brandId;
    /**
     * 产品封面图
     */
    private String picUrl;
    /**
     * 产品轮播图
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> sliderPicUrls;
    /**
     * 视频地址
     */
    private String videoUrl;
    /**
     * 排序序号
     */
    private Integer sort;
    /**
     * 产品状态
     * <p>
     * 枚举 {@link ProductSpuStatusEnum}
     */
    private Integer status;

    /**
     * 规格类型
     * <p>
     * false - 单规格
     * true - 多规格
     */
    private Boolean specType;
    /**
     * 计价模式：1-按单品计价、2-按称量计价
     *
     * @see ProductPriceModeEnum
     */
    private Integer priceMode;
    /**
     * 销售价，单位使用：分。如果是零售商家产品，则为零售价；如果是厂家产品，则为批发价。
     * <p>
     * 基于其对应的 {@link ProductSkuDO#getPrice()} sku单价最低的产品的
     */
    private Integer price;
    /**
     * 成本价，单位使用：分
     * <p>
     * 基于其对应的 {@link ProductSkuDO#getCostPrice()} sku单价最低的产品的
     */
    private Integer costPrice;
    /**
     * 市场价，单位使用：分
     * <p>
     * 基于其对应的 {@link ProductSkuDO#getMarketPrice()} sku单价最低的产品的
     */
    private Integer marketPrice;
    /**
     * 会员价，单位：分
     * <p>
     * 基于其对应的 {@link ProductSkuDO#getVipPrice()} sku单价最低的产品的
     */
    private Integer vipPrice;
    /**
     * 厂家零售价，单位：分。如果填写了则支持零售，不填则只支持批发。
     * <p>
     * 基于其对应的 {@link ProductSkuDO#getWholesaleForRetailPrice()} sku单价最低的产品的
     */
    @TableField(value = "wholesale_price")
    private Integer wholesaleForRetailPrice;

    /**
     * 是否积分产品
     */
    private Boolean isIntegral;
    /**
     * 库存
     * <p>
     * 基于其对应的 {@link ProductSkuDO#getStock()} 求和
     */
    private Integer stock;

    /**
     * 单位名称
     */
    private String unitName;

    /**
     * 配送类型/服务方式数组
     * <p>
     * 对应 {@link DeliveryTypeEnum} 枚举
     */
    @TableField(typeHandler = IntegerListTypeHandler.class)
    private List<Integer> deliveryTypes;
    /**
     * 物流配置模板编号
     * <p>
     * 对应 TradeDeliveryExpressTemplateDO 的 id 编号
     */
    private Long deliveryTemplateId;

    /**
     * 推荐类型
     * <p>
     * 枚举 {@link ProductSpuRecommendEnum}
     */
    private Integer recommend;

    /**
     * 是否置顶
     */
    private Boolean isSticky;

    /**
     * 赠送积分
     */
    private Integer giveIntegral;

    /**
     * 是否分佣产品
     */
    private Boolean isBrokerage;

    /**
     * 起购数量/起批数量
     */
    private Integer limitMinQuantity;
    /**
     * 限购数量
     */
    private Integer limitMaxQuantity;
    /**
     * 每次加购数量
     */
    private Integer stepQuantity;

    /**
     * 产品销量
     */
    private Integer salesCount;
    /**
     * 虚拟销量
     */
    private Integer virtualSalesCount;
    /**
     * 浏览量
     */
    private Integer browseCount;
    /**
     * 购买须知，JSON格式
     */
    private String guidance;
    /**
     * 标签，英文逗号分隔
     */
    @TableField(typeHandler = StringListTypeHandler.class)
    private List<String> labels;
    /**
     * 菜肴属性：0-无、1-主食、2-荤菜、3-素菜、4-汤、5-调料、6-饮品、7-水果、20-锅底、50-套餐、98-餐盒、99-备注
     *
     * @see DineAttributeEnum
     */
    private Integer dishAttribute;
    /**
     * 供应方名称
     */
    private String supplyName;
    /**
     * 供应方关联编号
     */
    private Long supplyRelatedId;
}
